package algorithm;

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * @author wuguojian
 * @description
 * @date 2022/7/28 下午2:20
 **/
public class lru {

    static class Cache<K,V> {
        // 缓存最大容量
        int capacity;
        Map<K,V> map;
        public Cache(int capacity) {
            this.capacity = capacity;
            // accessOrder设置为true保证访问顺序
            map = new LinkedHashMap<K,V>(16, 0.75f, true) {
                // 当调用map的put()和putAll()方法后会调用removeEldestEntry()检查是否应该删除eldest元素
                // 这里表示存放时如果超过最大容量应该移除末尾元素
                @Override
                protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
                    return size() > capacity;
                }
            };
        }
        /**
         * 容量
         * @return
         */
        public int capacity() {
            return this.capacity;
        }
        /**
         * Entry个数
         * @return
         */
        public int size() {
            return map.size();
        }
        /**
         * 存放
         * @param k
         * @param v
         * @return
         */
        public V put(K k, V v) {
            return map.put(k, v);
        }
        /**
         * 获取
         * @param k
         * @return
         */
        public V get(K k) {
            return map.get(k);
        }

    }

    public static void printCache(Cache cache) {
        cache.map.forEach(
                (k,v)->{
                    System.out.print(k+":"+v+",");
                }
        );
        System.out.println();
    }

    public static void main(String[] args) {
        // 创建一个固定容量为3的缓存
        Cache cache = new Cache<String, String>(3);
        // 存数据
        cache.put("a", "1");
        cache.put("b", "2");
        cache.put("c", "3");
        printCache(cache);
        cache.get("a");
        cache.get("b");
        printCache(cache);
        cache.put("d", "4");
        printCache(cache);
    }

}
